#ifndef MATERIALSERVICE_H
#define MATERIALSERVICE_H

#include <QVariantMap>
#include <QList>
#include <QSqlQuery>
#include "pogo/vo/materialvo.h"  // 引入MaterialVO类

/**
 * @brief 物料数据库操作类
 *
 * 封装物料表的所有数据库操作，直接使用MaterialVO作为数据载体，
 * 提供类型安全的CRUD操作，避免中间转换换过程中的数据不一致问题
 */
class MaterialService
{
public:
    /**
     * @brief 构造函数
     * 初始化表字段映射，确保与数据库表结构和MaterialVO属性一致
     */
    MaterialService();

    /**
     * @brief 插入物料记录
     * @param vo 物料视图对象
     * @param errorMsg 错误信息输出（可选）
     * @return 操作成功返回true
     */
    bool saveMaterial(const MaterialVO* vo, int oper_num, QString* errorMsg = nullptr);

    /**
     * @brief 更新仓库和货架物料数量
     * @param vo 物料视图对象（需包含有效ID）
     * @param errorMsg 错误信息输出（可选）
     * @return 操作成功返回true
     */
    bool updateSWMaterial(const MaterialVO* vo, int oper_num, QString* errorMsg = nullptr);

    /**
     * @brief 根据ID查询物料
     * @param materialId 物料ID
     * @param errorMsg 错误信息输出（可选）
     * @return 包含查询结果的MaterialVO列表
     */
    QList<MaterialVO*> getMaterialById(int materialId, QString* errorMsg = nullptr);

    /**
     * @brief 按条件查询物料
     * @param conditions 查询条件（如"quantity > 10"）
     * @param orderBy 排序方式（如"id DESC"）
     * @param limit 结果数量限制（0表示无限制）
     * @param errorMsg 错误信息输出（可选）
     * @return 符合条件的MaterialVO列表
     */
    QList<MaterialVO*> getMaterialsByCondition(const MaterialVO& vo, QString* errorMsg);

private:
    /**
     * @brief 将查询结果转换为MaterialVO列表
     * @param query SQL查询结果对象
     * @return 转换后的MaterialVO列表
     */
    QList<MaterialVO*> queryToVOList(QSqlQuery& query);

    /**
     * @brief 将MaterialVO转换为数据库操作的键值对
     * @param vo 物料视图对象
     * @return 与数据库字段对应的键值对
     */
    QVariantMap voToMap(const MaterialVO& vo);
};

#endif // MATERIALSERVICE_H
